//导入数据库操作模块
const db = require("../mysql")
const path = require("path")
//bycryptjs加密无法被逆向破解
//同一明文加密得到的结果不同
//使用bcryptjs的hashSync函数 例：bycryptjs.hashSync(要加密的值,随机盐（number）)
const bycryptjs = require("bcryptjs")

//导入生成token的包
const jwt = require("jsonwebtoken")

//导入密匙包
const secretKey = require("../config")


//注册新用户处理函数
exports.regUser = (req, res) => {
    const userInfo = req.body
    const sqlStr = "select * from user where username=?"
    db.query(sqlStr, userInfo.username, (err, result) => {
        //执行sql语句失败
        if (err) {
            return res.cc(err.message, 400)
        }
        //判断用户名是否被注册
        if (result.length > 0) {
            return res.cc("账号已被注册", 302)
        }
        userInfo.password = bycryptjs.hashSync(userInfo.password, 10)
        const sql = "insert into user set ?"
        db.query(sql, userInfo, (err, result) => {
            //判断sql语句是否成功
            if (err) return res.send({ status: 400, message: err.message })
            if (result.affectedRows !== 1) return res.send({ status: 300, msg: "注册用户失败" })
            res.send({
                status: 200,
                msg: "注册用户成功"
            })
        })
    })
}
//登录
exports.login = (req, res) => {
    const userInfo = req.body
    const sqlStr = "select * from user where username=?"
    db.query(sqlStr, userInfo.username, (err, result) => {
        //执行sql语句失败
        if (err) return res.cc(err.message, 400)
        if (result.length !== 1) {
            return res.cc("登录失败", 400)
        }
        const compara = bycryptjs.compareSync(userInfo.password, result[0].password)
        if (!compara) {
            return res.cc("密码错误", 400)
        }
        //es6语法，剔除掉password和user_pic
        const user = { ...result[0], password: "", user_pic: '' }
        //使用number默认单位是秒，使用字符串则需要提供单位，否则默认为毫秒
        const token = jwt.sign(user, secretKey.jwtSecretKey, { expiresIn: 3600 })
        res.send({
            status: 200,
            msg: "登录成功",
            token: 'Bearer ' + token
        })
    })
}
//个人信息
exports.getuserinfo = (req, res) => {
    const sqlStr = "select id,username,email,nickname from user where id=?"
    db.query(sqlStr, req.user.id, (err, result) => {
        if (err) return res.cc(err, 400)
        res.send({
            status: 200,
            msg: "获取用户信息成功",
            data: result[0]
        })

    })
}
//更新用户的基本信息
exports.userInfo = (req, res) => {
    const sqlStr = "update user set ? where id=?"
    db.query(sqlStr, [req.body, req.body.id], (err, result) => {
        if (err) return res.cc(err, 400)
        if (result.affectedRows !== 1) return res.cc("修改用户失败", 300)
        return res.cc("修改用户成功", 200)
    })
}
//重置密码
exports.updatepwd = (req, res) => {
    const sqlStr = "select * from user where id=?"
    db.query(sqlStr, req.user.id, (err, result) => {


        if (err) return res.cc(err)
        if (result.length !== 1) return res.cc("用户不存在", 300)
        let comparaPwd = bycryptjs.compareSync(req.body.oldPwd, result[0].password)
        if (!comparaPwd) return res.cc("原密码错误！")
        const newPwd = bycryptjs.hashSync(req.body.newPwd, 10)
        const updatePwdSql = "update user set password=? where id=?"
        db.query(updatePwdSql, [newPwd, req.user.id], (err, result) => {
            if (err) return res.cc(err, 400)
            if (result.affectedRows !== 1) return res.cc("修改密码失败", 300)
            return res.send({
                status: 200,
                msg: "修改密码成功"
            })
        })
    })
}
//更新头像
exports.userPic = (req, res) => {
    const sqlStr = "update user set user_pic=? where id=?"
    //存在base64图片太大，导致系统崩的问题
    db.query(sqlStr, [req.body.avatar, req.user.id], (err, result) => {
        if (err) return res.cc(err)
        if (result.affectedRows !== 1) return res.cc("更新头像失败", 300)
        return res.send({
            status: 200,
            msg: "更新成功"
        })
    })

}
//获取文章列表
exports.getActive = (req, res) => {
    const sqlStr = "select * from cate"
    db.query(sqlStr, (err, result) => {
        if (err) return res.cc(err)
        return res.send({
            status: 200,
            data: result
        })
    })
}
//新增文章分类
exports.addcate = (req, res) => {
    const sql = `select * from cate where is_delete=0 and (name=? or alias=?)`
    db.query(sql, [req.body.name, req.body.alias], (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err)

        // 分类名称 和 分类别名 都被占用
        if (results.length === 2) return res.cc('分类名称与别名被占用，请更换后重试！')
        if (results.length === 1 && results[0].name === req.body.name && results[0].alias === req.body.alias) return res.cc('分类名称与别名被占用，请更换后重试！')
        // 分类名称 或 分类别名 被占用
        if (results.length === 1 && results[0].name === req.body.name) return res.cc('分类名称被占用，请更换后重试！')
        if (results.length === 1 && results[0].alias === req.body.alias) return res.cc('分类别名被占用，请更换后重试！')

        const sqlStr = "insert into cate set ?"
        db.query(sqlStr, req.body, (err, result) => {
            if (err) return res.cc(err)
            if (result.affectedRows !== 1) return res.cc("添加失败", 300)
            return res.cc("添加成功", 200)
        })
    })

}

//删除文章分类
exports.deleteCate = (req, res) => {
    const sqlStr = "update cate set is_delete=1 where id=?"
    db.query(sqlStr, req.params.id, (err, result) => {
        if (err) return res.cc(err)
        if (result.affectedRows !== 1) return res.cc("删除失败", 300)
        return res.cc("删除成功", 200)
    })
}

//根据id获取文章信息
exports.getcateInfo = (req, res) => {
    const sqlStr = "select * from cate where id=?"
    db.query(sqlStr, req.params.id, (err, result) => {
        if (err) return res.cc(err)
        if (result.length !== 1) return res.cc("获取文章失败", 300)
        return res.send({
            status: 200,
            data: result[0]
        })
    })
}

//根据id更新文章
exports.updateAct = (req, res) => {
    const sqlStr = "select * from cate where id<>? and(name=? or alias =?) and is_delete=0"
    db.query(sqlStr, [req.body.id, req.body.name, req.body.alias], (err, results) => {
        if (err) return res.cc(err)
        // 分类名称 和 分类别名 都被占用
        if (results.length === 2) return res.cc('分类名称与别名被占用，请更换后重试！')
        if (results.length === 1 && results[0].name === req.body.name && results[0].alias === req.body.alias) return res.cc('分类名称与别名被占用，请更换后重试！')
        // 分类名称 或 分类别名 被占用
        if (results.length === 1 && results[0].name === req.body.name) return res.cc('分类名称被占用，请更换后重试！')
        if (results.length === 1 && results[0].alias === req.body.alias) return res.cc('分类别名被占用，请更换后重试！')


        const sql = "update cate set ? where id=?"

        db.query(sql, [req.body, req.body.id], (err, results) => {
            if (err) return res.cc(err)
            if (results.affectedRows !== 1) return res.cc("更新失败", 300)
            return res.cc("更新成功", 200)
        })
    })
}

//发布文章
exports.addActricle = (req, res) => {
    if (!req.file || req.filename !== 'cover_img') return res.cc('文章封面是必选参数', 300)
    const article = {
        ...req.body,
        // 文章封面在服务器端的存放路径
        cover_img: path.join('/uploads', req.file.filename),
        // 文章发布时间
        pub_date: new Date(),
        // 文章作者的Id
        author_id: req.user.id,
    }
    const sql = `insert into active set ?`
    db.query(sql,article,(err,results)=>{
        if(err) return res.cc(err)
        if(results.affectedRows!==1)return res.cc("发布文章失败",300)
        return res.cc("发布文章成功",200)
    })
}